#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtGui>
#include <iostream>
#include <QFileDialog>
#include <QTcpSocket>
#include <QTcpServer>
#include <QHostAddress>
#include <QDir>
#include <QNetworkInterface>
#include <QTimer>
#include <QSettings>
#include <QMenu>
const int MAXSIZE = 4096;
const int CONNECTPORT = 21;
namespace Ui {
class MainWindow;
}

class QTableWidgetItem;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_connectBtn_clicked();

    void on_listBtn_clicked();

    void on_login_clicked();

    void on_quitBtn_clicked();

    void on_selectPathBtn_clicked();
    void on_downloadBtn_clicked();
    void updateDownloadProgress(qint64 readBytes, qint64 totalBytes);
    void downloadFinished();
    
    // 右键菜单相关的槽函数
    void onFileTableContextMenuRequested(const QPoint& pos);
    void onLocalFileTableContextMenuRequested(const QPoint& pos); // 新增：本地文件右键菜单
    void onDownloadActionTriggered();
    void onDeleteActionTriggered();
    void onUploadActionTriggered(); // 新增：上传菜单项触发

private:
    Ui::MainWindow *ui;
    QString m_Address;
    QString m_Username;
    QString m_Password;
    QString m_Logininfo;
    QString m_Direinfo;
    QTcpSocket *controlSocket;
    QTcpSocket *dataSocket;
    QTcpServer *dataServer;
    QHostAddress serverAddress;
    char Respond[MAXSIZE];
    char Sendbuf[MAXSIZE];
    //bool RecvRespond();
    bool DataConnect();
    bool ControlConnect();
    bool FTPLogin();
    bool PORTRequest();
    bool PASVRequest(); // 新增：PASV模式请求函数
    bool LISTRequest();
    bool QUITRequest();
    bool RETRRequest();
    bool FISTORRequest(qint64 filesize);
    bool DELETERequest(const QString& filename);
    bool STORRequest(const QString& localFilePath, const QString& remoteFileName);
    int RespondCode(char* respond);
    // 保存和加载设置的函数
    void saveSettings();
    void loadSettings();

    // 右键菜单相关成员
    QMenu* m_contextMenu;
    QMenu* m_localContextMenu; // 新增：本地文件右键菜单
    QAction* m_downloadAction;
    QAction* m_deleteAction;
    QAction* m_uploadAction; // 新增：上传菜单项
    QString m_currentContextMenuFile; // 当前右键点击的文件名
    QString m_currentLocalContextMenuFile; // 新增：当前右键点击的本地文件名

private slots:
    void onDataConnected();
    void onDataReadyRead();
    void onDataBytesWritten(qint64 bytes); // 新增：数据发送完成信号
    void refreshLocalFileList(); // 刷新本地文件列表的槽函数
    void uploadFinished(); // 新增：上传完成槽函数

private:
    void parseFTPList(const QString &listData);
    void loadLocalFileList(const QString &path); // 加载本地文件列表的函数
    QTableWidgetItem *createTableItem(const QString &text, bool editable = false);
    void setCurCmd(QString cmd);
    QString getCurCmd();
    QString m_ftpCmd;//当前正在发送的命令
    QMutex m_lockCmd;

    QMap<QTcpSocket*, QFile*> m_mapSocketFile;
    QMap<QString, qint64> m_fileSizeMap; // 存储文件名到大小的映射
    QMap<QString, qint64> m_downloadedBytesMap; // 存储文件名到已下载字节数的映射
    QString m_currentDownloadFile; // 当前正在下载的文件名
    QString m_currentUploadFile; // 新增：当前正在上传的文件名
    qint64 m_uploadedBytes; // 新增：已上传字节数
    qint64 m_totalUploadBytes; // 新增：总上传字节数
    bool m_isPassiveMode; // 新增：是否使用被动模式
    bool m_isPassiveMode2; //是否使用自定义被动模式（保持一个连接)
    QHostAddress m_passiveAddress; // 新增：被动模式下服务器地址
    quint16 m_passivePort; // 新增：被动模式下服务器端口
    quint16 m_serverPort; //服务器端口
};

#endif // MAINWINDOW_H
